1 таблица: id юзера, баланс, номер карты
2:ID юзера, фио, макс.платеж
3:название товара, цена
Создать функцию, выполняющую покупку определенного товара с определенной карты.Сообщения выводить PRINT 'ом'

--Creating tables with primary keys and locks
CREATE TABLE Clients (
  id         INT            NOT NULL PRIMARY KEY,
  Balance    NUMERIC(11, 2) NOT NULL,
  CardNumber CHAR(16)       NOT NULL
) LOCK DATAROWS

CREATE TABLE Payments (
  id     INT            NOT NULL PRIMARY KEY,
  FIO    NVARCHAR(200)  NOT NULL,
  MaxPay NUMERIC(11, 2) NOT NULL
) LOCK DATAROWS

ALTER TABLE Payments
ADD CONSTRAINT FK_Payments_RELATIONS_Client FOREIGN KEY (id)
REFERENCES Clients (id)

CREATE TABLE Goods (
  Name  NVARCHAR(100)  NOT NULL PRIMARY KEY,
  Price NUMERIC(11, 2) NOT NULL
) LOCK DATAROWS

--creatings procs for inserting datas into tables

CREATE PROCEDURE insertClient(@id INT, @balance DECIMAL(11, 2), @cardNumber CHAR(16))
AS
  BEGIN
    INSERT INTO Clients VALUES (@id, @balance, @cardNumber)
  END

  CREATE PROCEDURE insertPayments(@id INT, @fio NVARCHAR(200), @maxPay DECIMAL(11, 2))
  AS
    BEGIN
      INSERT INTO Payments VALUES (@id, @fio, @maxPay)
    END

    CREATE PROCEDURE insertGoods(@name NVARCHAR(100), @price DECIMAL(11, 2))
    AS
      BEGIN
        INSERT INTO Goods VALUES (@name, @price)
      END


--iserting datas into tables
      EXEC mydb.dbo.insertClient (1, 1000.50, '1314565898976745')
GO
EXEC mydb.dbo.insertClient (2, 10000, '7894564812345846')
GO
EXEC mydb.dbo.insertClient (3, 2000, '5141354997462164')
GO
EXEC mydb.dbo.insertClient (4, 35000, '4458794654871325')
GO
EXEC mydb.dbo.insertClient (5, 500, '6549797461315489')
GO
EXEC mydb.dbo.insertPayments (1, 'Ivanov Ivan Ivanich', 999.99)
GO
EXEC mydb.dbo.insertPayments (2, 'Shalby Masha Victorovna', 9999.99)
GO
EXEC mydb.dbo.insertPayments (3, 'Skywalker Luke Vaderovich)', 1999.99)
GO
EXEC mydb.dbo.insertPayments (4, 'Parker Piter Spiderovich', 34999.99)
GO
EXEC mydb.dbo.insertPayments (5, 'Wayne Bruce Batmanovich', 499.99)
GO
EXEC mydb.dbo.insertGoods ('pen', 1.99)
GO
EXEC mydb.dbo.insertGoods ('iphone 3000', 3000)
GO
EXEC mydb.dbo.insertGoods ('Smith & Wesson', 10000.50)
GO
EXEC mydb.dbo.insertGoods ('slave', 20000)
GO
EXEC mydb.dbo.insertGoods ('Porshe Cayman', 57600.80)
GO

SELECT
  *
FROM Clients
SELECT
  *
FROM Payments
SELECT
  *
FROM Goods


CREATE FUNCTION buy(@nam NVARCHAR(100), @fio NVARCHAR(100))
  RETURNS NVARCHAR(100)
AS
  BEGIN
    DECLARE @price   NUMERIC(11, 2)
    DECLARE @balance NUMERIC(11, 2)
    DECLARE @str     NVARCHAR(100)
    DECLARE @ost     NUMERIC(11, 2) -- то, что останется на счету после покупки
    DECLARE @idr     INT  -- ид покупателя
    SET @price = (SELECT
                    Price
                  FROM Goods
                  WHERE Name = @nam)
    SET @balance = (SELECT
                      Balance
                    FROM Clients AS t1 JOIN Payments AS t2 ON t1.id = t2.id
                    WHERE t2.FIO LIKE '%' + @fio + '%')
    IF (@price < @balance)
      BEGIN
        SET @ost = @balance - @price
        SET @idr = (SELECT
                      id
                    FROM Payments
                    WHERE FIO LIKE '%' + @fio + '%')

        UPDATE Clients
        SET Balance = @ost
        WHERE id = @id

        SET @str = 'Thank you for purchasing '
      END
    ELSE
      BEGIN
        SET @str = 'You can not buy this product, not enough money.'
      END
    RETURN @str
  END
  SELECT
    dbo.buy('pen', 'Ivanov')
GO

--ругается на udate, мне так кажется, что его нельзя использовать внутри функции, но как это обойти?
--и еще никак не могу понять, зачем тут номер карты, разве его можно как-то привязать к балансу?